package fr.afcepf.atod18.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import fr.afcepf.atod18.data.Devise;
import fr.afcepf.atod18.data.Pays;

/**
 * 
 * @author stagiaire
 *
 */
public class DaoPays implements IdaoPays {

	/**
	 * requete Ajout d'un Pays.
	 */
	private final String reqAjout =
            "INSERT INTO pays (codeA2, drapeau, nom, devise_id) "
            + "VALUES (?,?,?,?)";
	@Override
	public int ajouter(Pays paramPays) {
		Connection cnx = UtilConnexionDevise.getConnexion();
		int cle =0;
        try {
            PreparedStatement pstmt =
                    cnx.prepareStatement(reqAjout,
                            Statement.RETURN_GENERATED_KEYS);
            pstmt.setString(1, paramPays.getCodeA2());
            pstmt.setBytes(2, paramPays.getDrapeau());
            pstmt.setString(3, paramPays.getNom());
            pstmt.setInt(4, paramPays.getDevise().getId());
            int retour = pstmt.executeUpdate();
            if (retour == 1) {
                ResultSet rsKey = pstmt.getGeneratedKeys();
                if (rsKey.next()) {
                    cle = rsKey.getInt(1);
                }
            }         } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return cle;
	}
	/**
	 * requete de modification d'un pays.
	 */
	private final String reqUpdate =
            "UPDATE pays SET codeA2=?, drapeau=?, nom=?, devise_id=? WHERE id=?";
	@Override
	public void modifier(Pays paramPays) {
		Connection cnx = UtilConnexionDevise.getConnexion();
        try {
            PreparedStatement pstmt =
                    cnx.prepareStatement(reqUpdate);
            pstmt.setString(1, paramPays.getCodeA2());
            pstmt.setBytes(2, paramPays.getDrapeau());
            pstmt.setString(3, paramPays.getNom());
            pstmt.setInt(4, paramPays.getDevise().getId());
            pstmt.setInt(5, paramPays.getId());
            pstmt.executeUpdate();
         } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
	}
/**
 * requete de suppression d'un pays.
 */
	private final String reqDelete =
            "DELETE FROM pays WHERE id=?";
	@Override
	public boolean supprimer(Pays paramPays) {
		Connection cnx = UtilConnexionDevise.getConnexion();
        try {
            PreparedStatement pstmt =
                    cnx.prepareStatement(reqDelete);
            pstmt.setInt(1, paramPays.getId());
            return  pstmt.executeUpdate() == 1;
         } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
		return false;
	}
/**
 * requete de recherche d'un pay par code A2.
 */
	private final String reqCherche =
            "SELECT * FROM pays LEFT JOIN devise ON pays.devise_id=devise.id WHERE codeA2=?";
	@Override
	public Pays rechercher(String paramcodeA2) {
		Connection cnx = UtilConnexionDevise.getConnexion();
		
        try {
            PreparedStatement pstmt =
                    cnx.prepareStatement(reqCherche);
            pstmt.setString(1, paramcodeA2);
   		 ResultSet rs = pstmt.executeQuery();
   		
   		 if(rs.next()){
   			 Pays retour = new Pays();
   			 retour.setId(rs.getInt("pays.id"));
	   		 retour.setCodeA2(rs.getString("codeA2"));
	   		 retour.setDrapeau(rs.getBytes("drapeau"));
	   		 retour.setNom(rs.getString("nom"));
	   		 Devise d =new Devise();
	   		 d.setId(rs.getInt("devise_id"));
	   		 d.setSymbole(rs.getString("Symbole"));
	   		 d.setCodeIso(rs.getString("codeIso"));
	   		 d.setLibelle(rs.getString("libelle"));
	   		 d.setTaux(rs.getDouble("Taux"));
	   		 retour.setDevise(d);
	   		 return retour;
   		 }
         } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
		 return null;
	}
	/**
	 * requete de liste des pays avec leur devise.
	 */
	private final String reqListe =
			 "SELECT * FROM pays LEFT JOIN devise  ON pays.devise_id=devise.id ORDER BY nom";
	@Override
	public List<Pays> lister() {
        List<Pays> retour = new ArrayList();
        Connection cnx = UtilConnexionDevise.getConnexion();
        try {
           PreparedStatement pstmt =
                   cnx.prepareStatement(reqListe);
           ResultSet rs = pstmt.executeQuery();
           while (rs.next()) {
     			 Pays p = new Pays();
       			 p.setId(rs.getInt("pays.id"));
    	   		 p.setCodeA2(rs.getString("codeA2"));
    	   		 p.setDrapeau(rs.getBytes("drapeau"));
    	   		 p.setNom(rs.getString("nom"));
    	   		 Devise d =new Devise();
    	   		 d.setId(rs.getInt("devise_id"));
    	   		 d.setSymbole(rs.getString("Symbole"));
    	   		 d.setCodeIso(rs.getString("codeIso"));
    	   		 d.setLibelle(rs.getString("libelle"));
    	   		 d.setTaux(rs.getDouble("Taux"));
    	   		 p.setDevise(d);
                 retour.add(p);
           }
       } catch (SQLException e) {
           e.printStackTrace();
       } finally {
           try {
               cnx.close();
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }
        return retour;
	}
	
	/**
	 * requete de recherche d'un pays avec sa devise par son id.
	 */
	private final String reqGet =
            "SELECT * FROM pays LEFT JOIN devise ON pays.devise_id=devise.id WHERE pays.id=?";
	@Override
	public Pays get(int paramIdPays) {
		Connection cnx = UtilConnexionDevise.getConnexion();
		
        try {
            PreparedStatement pstmt =
                    cnx.prepareStatement(reqGet);
            pstmt.setInt(1, paramIdPays);
   		 ResultSet rs = pstmt.executeQuery();
   		
   		 if(rs.next()){
   			 Pays retour = new Pays();
   			 retour.setId(rs.getInt("pays.id"));
	   		 retour.setCodeA2(rs.getString("codeA2"));
	   		 retour.setDrapeau(rs.getBytes("drapeau"));
	   		 retour.setNom(rs.getString("nom"));
	   		 Devise d =new Devise();
	   		 d.setId(rs.getInt("devise_id"));
	   		 d.setSymbole(rs.getString("Symbole"));
	   		 d.setCodeIso(rs.getString("codeIso"));
	   		 d.setLibelle(rs.getString("libelle"));
	   		 d.setTaux(rs.getDouble("Taux"));
	   		 retour.setDevise(d);
	   		 return retour;
   		 }
         } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
		 return null;
	}

}
